home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / Open Transport 1.3 / Open Transport SDK / Open Tpt Client Developer / Samples / Internet / OTUdpCatchSample.cp < prev    next >
Encoding:
Text File  |  1998-04-30  |  8.6 KB  |  390 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        OTUdpCatchSample.cp
  3.  
  4.     Contains:    UDP catch sample.
  5.  
  6.     Copyright:    © 1993-1997 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10.  
  11. // OT UDP Catch Test Program (as an SIOW Tool)
  12.  
  13. #include <QuickDraw.h>
  14. #include <stdio.h>
  15. #include <StdLib.h>
  16. #include <TextUtils.h>
  17. #include <strings.h>
  18. #include <String.h>
  19. #include <Events.h>
  20. #include <Windows.h>
  21. #include <Menus.h>
  22. #include <Devices.h>
  23. #include <Windows.h>
  24. #include <OpenTransport.h>
  25. #include <OpenTptInternet.h>
  26.  
  27.  
  28. /*******************************************************************************
  29. ** GLOBAL VARIABLES
  30. ********************************************************************************/
  31.  
  32. #define kMaxDataLen 256
  33.  
  34. InetPort    gCatchPort=0;
  35. InetHost    gCatchIpAddr=0;
  36. InetPort      gPitchPort=0;
  37. InetHost    gPitchIpAddr=0;
  38.  
  39. UInt16        gBindCompleted    = 0;
  40. UInt16        gDataToRead        = 0;
  41. UInt8        data[kMaxDataLen];
  42.  
  43. struct InetAddress reqsin, retsin, tmpsin;
  44.  
  45. Boolean    gFirstTime = true;
  46.  
  47. /*******************************************************************************
  48. ** Function Prototypes
  49. ********************************************************************************/
  50.  
  51. void        Inits();
  52. void        CleanUp();
  53. void        Idle();    
  54. void        DoIt();
  55. OSStatus    DoStaticBind(TEndpoint* ep);
  56. OSStatus    DoReceive(TEndpoint* ep);
  57. Boolean        UserAbort();
  58. OSStatus    DoGetInterfaceInfo(SInt32 i);
  59.  
  60.  
  61. /*******************************************************************************
  62. **  main function
  63. ********************************************************************************/
  64.  
  65. void main(int, char** ) 
  66. {
  67.     char userInput[256];
  68.  
  69.     do 
  70.     {
  71.         Inits();
  72.         DoIt();
  73.         CleanUp();
  74.         
  75.         fprintf(stderr, "Again (y/n)?\n");
  76.         gets(&userInput[0]);
  77.     } while ( userInput[0] == 'y' || userInput[0] == 'Y' );
  78.     
  79.     fprintf(stderr, "Bye\n");
  80.     exit (0);
  81. }
  82.  
  83. /*******************************************************************************
  84. ** Initialize Quickdraw and ASLM
  85. ********************************************************************************/
  86.  
  87. void Inits()
  88. {
  89.     if ( gFirstTime == true )
  90.     {
  91.         InitGraf(&qd.thePort);
  92.         gFirstTime = false;
  93.     }
  94.  
  95.     if ( InitOpenTransport() != kOTNoError )
  96.     {
  97.         fprintf(stderr, "OTUdpCatch: Could not initialize Open Transport, exiting\n");
  98.         exit(1);
  99.     }
  100. }
  101.  
  102. /*******************************************************************************
  103. ** Clean up at the end
  104. ********************************************************************************/
  105.  
  106. void CleanUp()
  107. {
  108.     CloseOpenTransport();
  109. }
  110.  
  111. /*******************************************************************************
  112. ** Idle
  113. ********************************************************************************/
  114.  
  115. void Idle()
  116. {
  117.     SystemTask();
  118. }
  119.  
  120. /*******************************************************************************
  121. ** EventHandler
  122. ********************************************************************************/
  123.  
  124. pascal void EventHandler(void*, OTEventCode event, OTResult, void*)
  125. {
  126.     if (event == T_DATA)
  127.     {
  128.         gDataToRead = 1;
  129.         return;
  130.     }
  131.     if (event == T_BINDCOMPLETE)
  132.     {
  133.         gBindCompleted = 1;
  134.         return;
  135.     }
  136.     return;
  137. }
  138.  
  139. /*******************************************************************************
  140. ** DoIt
  141. ********************************************************************************/
  142.  
  143. void DoIt()
  144. {
  145.     TEndpoint*        ep = NULL;
  146.     TEndpointInfo    info;
  147.     OSStatus        err = kOTNoError;
  148.     SInt32            myport = 0;
  149.     UInt32            myaddr = 0;
  150.     char            mystr[255];
  151.  
  152.     fprintf(stderr, "What UDP port should I listen to ?\n");
  153.     if ( gets(mystr) != 0 )
  154.     {
  155.         stringtonum(mystr, &myport);
  156.         gCatchPort = (InetPort) myport;
  157.     }
  158.     fprintf(stderr, "The program will listen for packets on port <%d>\n", gCatchPort);
  159.     fprintf(stderr, "until \'cmd .\' keys are pressed\n");
  160.     
  161.     OTInitInetAddress(&reqsin, gCatchPort, (InetHost) 0);
  162.  
  163.     do
  164.     {
  165.         //
  166.         // Now create a UDP
  167.         //
  168.         ep = OTOpenEndpoint(OTCreateConfiguration(kUDPName), 0, &info, &err);
  169.  
  170.         if ( ep == NULL || err != kOTNoError )
  171.         {
  172.             ep = NULL;
  173.             fprintf(stderr,"ERROR: OpenEndpoint(\"UDP\") failed with %d\n", err);
  174.             break;
  175.         }
  176.         //
  177.         // Install notifier we're going to use for testing
  178.         //
  179.         err = ep->InstallNotifier(&EventHandler, 0);
  180.         if ( err != kOTNoError )
  181.         {
  182.             fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
  183.             break;
  184.         }
  185.         ep->SetSynchronous();
  186.  
  187.         //
  188.         // Try to bind
  189.         // 
  190.         ep->SetAsynchronous();
  191.         err = DoStaticBind(ep);
  192.         if ( err != kOTNoError )
  193.             break;        
  194.         
  195.         //
  196.         // Display the interface info (IP address)
  197.         //
  198.         err = DoGetInterfaceInfo(0);
  199.         if ( err != kOTNoError )
  200.             break;        
  201.         
  202.         ep->SetAsynchronous();
  203.         do
  204.         {
  205.             //
  206.             // Try to receive some data
  207.             // 
  208.             if (gDataToRead == 1) {
  209.                 err = DoReceive(ep);
  210.                 if ( err != kOTNoError && err != kOTNoDataErr )
  211.                     break;
  212.             }
  213.             Idle();
  214.         } while (!UserAbort());
  215.         //
  216.         // Try to Unbind
  217.         // 
  218.         ep->SetSynchronous();
  219.         err = ep->Unbind();
  220.         if ( err != kOTNoError )
  221.         {
  222.             fprintf(stderr, "ERROR: Unbind() returned %d\n", err);
  223.             break;
  224.         }
  225.     } while (false);
  226.  
  227.     if ( ep != NULL )
  228.     {
  229.         //
  230.         // Remove notifier
  231.         //
  232.         ep->RemoveNotifier();
  233.         //
  234.         // Get rid of endpoint.
  235.         //
  236.         err = OTCloseProvider(ep);
  237.         if ( err != kOTNoError )
  238.         {
  239.             fprintf(stderr, "ERROR: CloseEndpoint() failed with %d\n", err);
  240.         }
  241.     }
  242. }
  243.  
  244. /*******************************************************************************
  245. ** DoStaticBind
  246. ********************************************************************************/
  247.  
  248. OSStatus DoStaticBind(TEndpoint* ep)
  249. {
  250.     TBind        req, ret;
  251.     OSStatus     err;
  252.  
  253.     // bind udp to current address and port 2001
  254.     req.addr.len = sizeof(struct InetAddress);
  255.     req.addr.buf = (unsigned char *) &reqsin;
  256.     req.qlen = 1;                                        // don't care for udp
  257.     ret.addr.maxlen = sizeof(struct InetAddress);
  258.     ret.addr.buf = (unsigned char *) &retsin;
  259.  
  260.     err = ep->Bind(&req, &ret);
  261.     if ( err != kOTNoError )
  262.     {
  263.         fprintf(stderr, "Static Bind returns %d\n", err);
  264.         return err;
  265.     }
  266.     while (gBindCompleted == 0)
  267.     {
  268.     }
  269.     gBindCompleted = 0;
  270.     return err;
  271. }
  272.  
  273. /*******************************************************************************
  274. ** DoReceive
  275. ********************************************************************************/
  276.  
  277. OSStatus DoReceive(TEndpoint* ep)
  278. {
  279.     OSStatus    err = kOTNoError;
  280.     TUnitData    unitdata;
  281.     OTFlags        flags;
  282.     char        mystr[255];
  283.  
  284.     // Receive a UDP datagram
  285.     gDataToRead = 0;
  286.     while ( true )
  287.     {
  288.         unitdata.addr.maxlen = sizeof(struct InetAddress);
  289.         unitdata.opt.maxlen = 0;
  290.         unitdata.opt.buf = 0;
  291.         unitdata.udata.maxlen = kMaxDataLen;
  292.         unitdata.udata.buf = data;
  293.         unitdata.addr.buf = (UInt8*) &tmpsin;
  294.     
  295.         err = ep->RcvUData( &unitdata, &flags);
  296.         if ( err == kOTNoError )
  297.         {
  298.             OTInetHostToString(tmpsin.fHost, mystr);
  299.             data[unitdata.udata.len] = '\0';
  300.             fprintf(stderr, "Packet from <%s:%d> : size: <%d> data: \"%s\"\n", mystr, 
  301.                     tmpsin.fPort, unitdata.udata.len, data);
  302.         }
  303.         else
  304.         {
  305.             if ( err != kOTNoDataErr )
  306.                 fprintf(stderr, "RcvUData returns %d\n", err);
  307.             break;
  308.         }
  309.     };
  310.     return err;
  311. }
  312.  
  313. /*******************************************************************************
  314. ** IsPressed
  315. ********************************************************************************/
  316.  
  317. Boolean IsPressed(UInt16 k, KeyMap map)
  318. {
  319.     UInt8* keyMap    = (UInt8*)map;
  320.     return (keyMap[k >> 3] >> (k & 7) & 1);
  321. }
  322.  
  323. /*******************************************************************************
  324. ** CmdKey
  325. ********************************************************************************/
  326.  
  327. Boolean UserAbort()
  328. {
  329.     KeyMap    keyMap;
  330.     
  331.     GetKeys(keyMap);
  332.     if ( IsPressed(0x37, keyMap) && 
  333.         (IsPressed(0x2F, keyMap) || IsPressed(0x41, keyMap)) )
  334.     {
  335.         FlushEvents(everyEvent, 0);    // needed so that "gets" gets not confused later on
  336.         return true;
  337.     }
  338.     else
  339.     {
  340.         return false;
  341.     }
  342. }
  343.  
  344. /*******************************************************************************
  345. ** DoGetInterfaceInfo
  346. ********************************************************************************/
  347.  
  348. OSStatus DoGetInterfaceInfo(SInt32 i)
  349. {
  350.     OSStatus            err;
  351.     InetInterfaceInfo    myInfo;
  352.     union
  353.     {
  354.         InetHost    addr;
  355.         UInt8        bytes[4];
  356.     } tmpAddr;
  357.     
  358.     do
  359.     {
  360.         memset(&myInfo, 0, sizeof(InetInterfaceInfo));
  361.         err = OTInetGetInterfaceInfo(&myInfo, i);
  362.         if (err != kOTNoError)
  363.         {
  364.             if (err == kOTNotFoundErr)
  365.             {
  366.                 fprintf(stderr, "Interface %d: Does Not Exist\n", i);
  367.                 break;
  368.             }
  369.             else
  370.             {
  371.                 fprintf(stderr, "Error! GetInterfaceInfo returns %d\n", err);
  372.                 break;
  373.             }
  374.         }
  375.         tmpAddr.addr = myInfo.fAddress;
  376.         fprintf(stderr, "Interface %d : Address = %d.%d.%d.%d\n ", i, tmpAddr.bytes[0],
  377.                 tmpAddr.bytes[1], tmpAddr.bytes[2], tmpAddr.bytes[3]);
  378.         tmpAddr.addr = myInfo.fNetmask;
  379.         fprintf(stderr, "Netmask = %d.%d.%d.%d\n ",  tmpAddr.bytes[0],
  380.                 tmpAddr.bytes[1], tmpAddr.bytes[2], tmpAddr.bytes[3]);
  381.         tmpAddr.addr = myInfo.fBroadcastAddr;
  382.         fprintf(stderr, "Broadcast Address = %d.%d.%d.%d\n",  tmpAddr.bytes[0],
  383.                 tmpAddr.bytes[1], tmpAddr.bytes[2], tmpAddr.bytes[3]);
  384.         fprintf(stderr, "\n");
  385.     } while ( false );
  386.     
  387.     return err;
  388. }
  389.  
  390.